gtk-demo: Fix up image handling in the clipboard demo
authorMatthias Clasen <mclasen@redhat.com>
Thu, 15 Oct 2020 13:16:17 +0000 (09:16 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Thu, 15 Oct 2020 13:19:17 +0000 (09:19 -0400)
Using GtkIconPaintable+GtkPicture is not good for symbolic
icons - they don't get properly colored that way. So change
things around to use the icon name if we have it.

Fixes: #3252
demos/gtk-demo/demoimage.c

index 40acbd2dcedd65e9330cc74cb8d57b7954d27b90..a7ecb6e213b0b3001dc702d95a191f51263636b7 100644 (file)
@@ -47,6 +47,38 @@ get_image_paintable (GtkImage *image)
     }
 }
 
+static void
+update_drag_icon (DemoImage   *demo,
+                  GtkDragIcon *icon)
+{
+  const char *icon_name;
+  GdkPaintable *paintable;
+  GtkWidget *image;
+
+  switch (gtk_image_get_storage_type (GTK_IMAGE (demo->image)))
+    {
+    case GTK_IMAGE_PAINTABLE:
+      paintable = gtk_image_get_paintable (GTK_IMAGE (demo->image));
+      image = gtk_image_new_from_paintable (paintable);
+      break;
+    case GTK_IMAGE_ICON_NAME:
+      icon_name = gtk_image_get_icon_name (GTK_IMAGE (demo->image));
+      image = gtk_image_new_from_icon_name (icon_name);
+      break;
+    case GTK_IMAGE_EMPTY:
+    case GTK_IMAGE_GICON:
+    default:
+      g_warning ("Image storage type %d not handled",
+                 gtk_image_get_storage_type (GTK_IMAGE (demo->image)));
+      return;
+    }
+
+  gtk_image_set_pixel_size (GTK_IMAGE (image),
+                            gtk_image_get_pixel_size (GTK_IMAGE (demo->image)));
+
+  gtk_drag_icon_set_child (icon, image);
+}
+
 static void
 drag_begin (GtkDragSource *source,
             GdkDrag       *drag,
@@ -54,14 +86,8 @@ drag_begin (GtkDragSource *source,
 {
   GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (source));
   DemoImage *demo = DEMO_IMAGE (widget);
-  GdkPaintable *paintable;
 
-  paintable = get_image_paintable (GTK_IMAGE (demo->image));
-  if (paintable)
-    {
-      gtk_drag_icon_set_from_paintable (drag, paintable, -2, -2);
-      g_object_unref (paintable);
-    }
+  update_drag_icon (demo, GTK_DRAG_ICON (gtk_drag_icon_get_for_drag (drag)));
 }
 
 static GdkContentProvider *